package com.java.base.exercise.jvm;

import com.java.base.exercise.current.HeapOOM;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @Author RenPu
 * @Date 2021/10/11 15:33
 * @Version 1.0
 * @Description: 方法区内存溢出
 * 参数配置 VM Args:-XX:PermSize=10M-XX:MaxPermSize=10M
 * 场景：
 * 在经常大量生产Class的应用中，
 * 例如：
 * CGlib字节码增强和动态语言，JSP或者动态生成JSP文件的应用，
 * 基于OSGI的应用（即使同一个，类文件被不同的加载器加载，也会视为不同的类）
 **/
public class JavaMethodAreaOOM {

    public static void main(String[] args) {
        while (true) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(OOMObject.class);
            enhancer.setUseCache(false);
            enhancer.setCallback(new MethodInterceptor() {
                @Override
                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
                    return proxy.invokeSuper(obj, args);
                }
            });
            enhancer.create();
        }
    }


    static class OOMObject {

    }
}

